Database engines and database-centric applications have become very complex software systems. As a result, significant amounts of testing and debugging are needed to implement a database service.
One aspect of testing is to uncover the presence of a “bug” (or undesirable system behavior); debugging is used to identify the root cause of the problem so as to determine ways to fix the bug. When possible, each bug is associated with a precise set of steps, referred to as a “repro,” which deterministically reproduces the error.
The starting point for the debugging process is often a large repro that includes a number of aspects that are irrelevant to reproducing the bug. This is generally a consequence of automatic randomized test generators, or real-world application scenarios. The length and complexity of repros prevents developers from reacting quickly to new bugs, because usually a long manual “repro-minimization” phase needs to occur before the actual debugging procedure takes place.